import java.util.Arrays;
import java.util.Scanner;

public class Day_eight {

    //字母收集
    // 有一个n∗m 的矩形方阵，每个格子上面写了一个小写字母。
    //小红站在矩形的左上角，她每次可以向右或者向下走，走到某个格子上就可以收集这个格子的字母。
    //小红非常喜欢 "love" 这四个字母。她拿到一个 l 字母可以得 4 分，拿到一个 o 字母可以得 3 分，
    // 拿到一个 v 字母可以得 2 分，拿到一个 e 字母可以得 1 分。
    //她想知道，在最优的选择一条路径的情况下，她最多能获取多少分？
    //输入描述：
    //1≤n,m≤500
    //接下来的n 行 每行一个长度为m 的、仅有小写字母构成的字符串，代表矩形方阵。
    //输出描述：
    //小红最大可能的得分。
    //示例1
    //输入：
    //3 2
    //ab
    //cd
    //ef
    //输出：
    //1
    //说明：
    //选择下、下、右）这条路径即可，可以收集到 acef 这四个字母各一次，获得 0+0+1+0=1 分。

    //示例2
    //输入：
    //2 3
    //lle
    //ove
    //输出：
    //11
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

        int n = s.nextInt();
        int m = s.nextInt();
        char[][] arr =new char[n+1][m+1];

        for (int i = 1; i <= n; i++) {
            char[] ch = s.next().toCharArray();
            for (int j = 1; j <= m; j++) {
                arr[i][j] = ch[j-1];
            }
        }

        int[][] dp = new int[n+1][m+1];

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                int t = 0;
                if (arr[i][j] == 'l') t = 4;
                else if(arr[i][j] == 'o') t = 3;
                else if(arr[i][j] == 'v') t = 2;
                else if(arr[i][j] == 'e') t = 1;

                dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])+t;
            }
        }
        System.out.println(dp[n][m]);
    }

    //数组中的最长连续子序列
    //给定无序数组arr，返回其中最长的连续序列的长度(要求值连续，位置可以不连续,
    // 例如 3,4,5,6为连续的自然数）
    //数据范围：1≤n≤10^5 数组中的值满足 1≤val≤10^8
    //要求：空间复杂度O(n)，时间复杂度 O(nlogn)
    //示例1
    //输入：
    //[100,4,200,1,3,2]
    //返回值：
    //4

    //示例2
    //输入：
    //[1,1,1]
    //返回值：
    //1
    public int MLS (int[] arr) {
        Arrays.sort(arr);

        int n = arr.length;
        int ret = 0;
        for (int i = 0; i < n; ) {
            int j = i+1;
            int count = 1;
            while(j<n){
                if (arr[j] -arr[j-1] == 1){
                    count++;
                    j++;
                }else if(arr[j] - arr[j-1] == 0){
                    j++;
                }else{
                    break;
                }
            }
            ret = Math.max(ret,count);
            i = j;
        }
        return ret;
    }

    //求最小公倍数
    //正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值，
    // 设计一个算法，求输入A和B的最小公倍数。
    //数据范围：
    //1≤a,b≤100000
    //输入描述：
    //输入两个正整数A和B。
    //输出描述：
    //输出A和B的最小公倍数。
    //示例1
    //输入：
    //5 7
    //输出：
    //35
    public static  int gcd(int a, int b){
        if (b == 0) return a;
        return gcd(b, a%b);
    }

    public static void main1(String[] args) {
        Scanner s = new Scanner(System.in);

        int a = s.nextInt();
        int b = s.nextInt();
       // System.out.println(a*b /gcd(a,b));
        int c = a % b;
        long d = (long)a * (long)b;
        while (c != 0){
            a = b;
            b = c;
            c = a % b;
        }
        System.out.println(d/b);
    }
}
